new和Object.create的区别
chenpeng 2020-11-30 JS API
Object.create
语法:
Object.create(proto[, propertiesObject])
1
参数:
proto:新创建对象的原型对象propertiesObject:对象的属性描述符以及相应的属性名称,描述符具有以下键:configurable- 是否可配置,默认为
false
- 是否可配置,默认为
enumerable- 是否可枚举,默认为
false
- 是否可枚举,默认为
writable- 是否可修改,默认为
false
- 是否可修改,默认为
value- 该属性对应的值,默认为
undefined
- 该属性对应的值,默认为
get- 属性的 getter 函数,当访问该属性时,会调用此函数,该函数的返回值会被用作属性的值,默认为
undefined
- 属性的 getter 函数,当访问该属性时,会调用此函数,该函数的返回值会被用作属性的值,默认为
set- 属性的 setter 函数,当属性值被修改时,会调用此函数,默认为
undefined
- 属性的 setter 函数,当属性值被修改时,会调用此函数,默认为
new 和 Object.create 创建对象的区别:
function Person(name, age) {
this.name = name;
this.age = age;
}
const test1 = new Person('张三', 20);
const test2 = Object.create(Person.prototype, {
name: {
value: '赵四'
},
age: {
value: 20
}
});
console.log(test1); // Person {name: "张三", age: 20}
console.log(test2); // Person {name: "赵四", age: 20}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new 创建对象直接使用构造函数即可,而 Object.create 需要传入构造函数的原型,将新创建对象的原型指向构造函数的原型
如果传入的原型对象为 null
const test2 = Object.create(null, {
name: {value: '赵四'},
age: {value: 20}
});
/*
{name: "赵四", age: 20}
age: 20
name: "赵四"
*/
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9

新创建的对象就不会继承 Object 的属性和方法
如果传入的原型对象为 {}
const test2 = Object.create({}, {
name: {value: '赵四'},
age: {value: 20}
});
1
2
3
4
2
3
4

新创建的对象在 Object 原型的基础上又多了一层原型嵌套
如果不传入原型对象
const test2 = Object.create({
name: {value: '赵四'},
age: {value: 20}
});
1
2
3
4
2
3
4

新创建对象的属性会绑定到对象的原型对象上
使用 Object.create(null) 创建对象,没有任何属性,可以得到一个非常干净且高度定制的对象